using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Criterion;
using Didsoft.DataAccess.NHibernate;
using Didsoft.DataAccess.Contracts;
using Boa.HD.AccesoDatos.Entidades;
using Boa.HD.AccesoDatos.Contratos;
using Didsoft.DataAccess.NHibernate.Extensions;
using Boa.HD.AccesoDatos.Entidades.DTO;

namespace Boa.HD.AccesoDatos.Contexto
{
   public class HD_DefinicionProblemaAccesoDatos : DataAccessBase<HD_DefinicionProblema>, IHD_DefinicionProblemaAccesoDatos
   {
     public HD_DefinicionProblemaAccesoDatos()
     {
     }
     
     /// <summary>
     /// Devuelve una lista IList<HD_DefinicionProblema> con todas las ocurrencias encontradas, en base a filtro.
     /// </summary>
     /// <param name="filtro"></param>
     /// <returns></returns>
     public IList<HD_DefinicionProblema> BuscarPorFiltro(string filtro)
     {
             ICriteria criteria = Session.CreateCriteria(typeof(HD_DefinicionProblema));
             criteria.Add(
                Expression.Or(Expression.Like("Nombre", filtro + "%"), Expression.Like("Descripcion", filtro + "%"))
         ); 
             return criteria.List<HD_DefinicionProblema>();
     }

     public IList<HD_DefinicionProblemaLite> ProblemasDefinidosRecursivo(bool incluirSinSolucionRapida)
     {
         string sql = @"WITH DefProblema (DefinicionProblemaId, GuidProblema, Nombre, Descripcion, Prioridad, TieneSolucionRapida, AIT_TipoEquipoId)
                        AS
                        (
	                        SELECT DefinicionProblemaId, GuidProblema, CONVERT(varchar(1000), Nombre),Descripcion,  Prioridad, TieneSolucionRapida, AIT_TipoEquipoId
		                        FROM HD_DefinicionProblema
		                        WHERE ProblemaPadreId is null and TieneSolucionRapida = 0
	                        UNION ALL
                        --RECURSIVIDAD
	                        SELECT dp.DefinicionProblemaId, dp.GuidProblema, CONVERT(varchar(1000), tmp.Nombre+' -> '+dp.Nombre),dp.Descripcion,  dp.Prioridad, dp.TieneSolucionRapida , dp.AIT_TipoEquipoId
		                        FROM HD_DefinicionProblema AS dp
		                        JOIN DefProblema AS tmp
			                        ON dp.ProblemaPadreId = tmp.DefinicionProblemaId
                        )
                        -- Desplegar ResultSet
                        SELECT * FROM DefProblema where TieneSolucionRapida = :incluirSinSolucionRapida
                        ";

         var query = Session.CreateSQLQuery(sql);
         query.SetBoolean("incluirSinSolucionRapida", incluirSinSolucionRapida);
         return query.ListBeanTransformer<HD_DefinicionProblemaLite>();     
     }


     public IList<HD_DefinicionProblemaLite> ProblemasDefinidosSoloHijos()
     {
         string sql = @"WITH DefProblema (DefinicionProblemaId, ProblemaPadreId, GuidProblema, Nombre, Descripcion, Prioridad, TieneSolucionRapida, AIT_TipoEquipoId)
                        AS
                        (
	                        SELECT DefinicionProblemaId, ProblemaPadreId, GuidProblema, CONVERT(varchar(1000), Nombre),Descripcion,  Prioridad, TieneSolucionRapida, AIT_TipoEquipoId
		                        FROM HD_DefinicionProblema
		                        WHERE ProblemaPadreId is null and TieneSolucionRapida = 0
	                        UNION ALL
                        --RECURSIVIDAD
	                        SELECT dp.DefinicionProblemaId, dp.ProblemaPadreId, dp.GuidProblema, CONVERT(varchar(1000), tmp.Nombre+' -> '+dp.Nombre),dp.Descripcion,  dp.Prioridad, dp.TieneSolucionRapida , dp.AIT_TipoEquipoId
		                        FROM HD_DefinicionProblema AS dp
		                        JOIN DefProblema AS tmp
			                        ON dp.ProblemaPadreId = tmp.DefinicionProblemaId
                        )
                        -- Desplegar ResultSet                        
                        SELECT DefinicionProblemaId, GuidProblema, Nombre, Descripcion, Prioridad, TieneSolucionRapida, AIT_TipoEquipoId FROM DefProblema where ProblemaPadreId is not null
                        
                        ";

         var query = Session.CreateSQLQuery(sql);         
         return query.ListBeanTransformer<HD_DefinicionProblemaLite>();
     }


     public IList<DtoDefProblemaPromedio> ProblemasYPromediosAtencion()
     {
         string sql = @"select dp.DefinicionProblemaId, dp.Nombre, dp.Descripcion, 
		                        dp.MinutosEstimacionSolucion,
		                        AVG(DATEDIFF(MINUTE, hpaAtendiendo.FechaRegistro,hpaSolucionado.FechaRegistro)) MinutosPromedioAtencion

                        from HD_HistoriaProblemaAsistido hpaSolucionado
                        inner join HD_SolicitudAsistencia sa on sa.SolicitudAsistenciaId = hpaSolucionado.SolicitudAsistenciaId
                        inner join HD_DefinicionProblema dp on dp.DefinicionProblemaId = sa.DefinicionProblemaId

                        inner join HD_HistoriaProblemaAsistido hpaAtendiendo on hpaAtendiendo.HistoriaProblemaAsistidoId = hpaSolucionado.HistorialProblemaPadreId

                        where hpaSolucionado.EstadoTrabajoId = 5
                        group by dp.DefinicionProblemaId,
		                         dp.Nombre,
		                         dp.Descripcion,
		                         dp.MinutosEstimacionSolucion		 
                        having AVG(DATEDIFF(MINUTE, hpaAtendiendo.FechaRegistro,hpaSolucionado.FechaRegistro)) > dp.MinutosEstimacionSolucion
                        ";

         var query = Session.CreateSQLQuery(sql);
         return query.ListBeanTransformer<DtoDefProblemaPromedio>();
     }

   }
}

